//Copyright  2015 Max "Shrinker" Wieden
//Refer to license for license details.

//this grammar matches Half-Life 2 VMF files
//trained with the Counter-Strike: Global Offensive sample maps
Tokens:
	LBrace        = '{';
	RBrace        = '}';
	Name          = (['a'-'z'] | '_')+;
	StringLiteral = '\"' (~['\"'])* '\"';

FillerTokens:
	Whitespace = (['\t', ' ', '\r', '\n'])+;

TokenSpecializations:
	KeyEntity = Name("entity");
	KeyHidden = Name("hidden");
	KeySide   = Name("side"  );
	KeySolid  = Name("solid" );
	KeyWorld  = Name("world" );

Rules:
Start = {
	(
		World
	|	Entity
	|	HiddenEntities
	|	OtherStuff
	)*
	EOF
}

World = {
	KeyWorld
	LBrace
	(
		KeyValuePair
	|	Solid
	|	HiddenSolids
	|	OtherStuff
	)*
	RBrace
}

Solid = {
	KeySolid
	LBrace
	(
		KeyValuePair
	|	Side
	|	OtherStuff
	)*
	RBrace
}

Entity = {
	KeyEntity
	LBrace
	(
		KeyValuePair
	|	Solid
	|	HiddenSolids
	|	OtherStuff
	)*
	RBrace
}

HiddenSolids   = {KeyHidden LBrace (Solid )* RBrace}
HiddenEntities = {KeyHidden LBrace (Entity)* RBrace}

Side = {
	KeySide
	LBrace
	(
		KeyValuePair
	|	OtherStuff
	)*
	RBrace
}

OtherStuff = {
	Name
	LBrace
	(
		KeyValuePair
	|	OtherStuff
	)*
	RBrace
}

KeyValuePair = {StringLiteral StringLiteral}
